package cn.jetpiece.cloud.joss.app.modular.object.service;

import cn.jetpiece.cloud.joss.api.object.model.params.CompleteMultiPartUploadObject;
import cn.jetpiece.cloud.joss.api.object.model.params.InitMultiPartUploadObject;
import cn.jetpiece.cloud.joss.api.object.model.params.MultiPartUploadObject;
import cn.jetpiece.cloud.joss.api.object.model.params.PutObject;
import cn.jetpiece.cloud.joss.api.object.model.result.JossPartEtag;
import cn.jetpiece.cloud.joss.api.object.model.result.UploadObjectResult;
import cn.jetpiece.cloud.joss.app.modular.object.model.BucketInfo;
import cn.jetpiece.cloud.model.response.Result;
import org.springframework.web.multipart.MultipartFile;

/**
 * <p>
 * 对象 服务类
 * </p>
 *
 * @author XuJZ
 * @since 2020-09-05
 */
public interface ObjectService {

    /**
     * 初始化分片上传
     *
     * @param objectName 对象名称
     * @param param      请求信息
     * @param bucketInfo 桶信息
     * @return uploadId
     */
    String initMultipartUpload(String objectName, InitMultiPartUploadObject param, BucketInfo bucketInfo);

    /**
     * 分片上传
     *
     * @param objectName 对象名称
     * @param param      请求信息
     * @param bucketInfo 桶信息
     * @param file       文件信息
     * @return 分片结果
     */
    JossPartEtag multipartUpload(String objectName, MultiPartUploadObject param, BucketInfo bucketInfo, MultipartFile file);

    /**
     * 合并分片上传
     *
     * @param objectName 对象名称
     * @param param      请求信息
     * @param bucketInfo 桶信息
     * @return 分片结果
     */
    Result<UploadObjectResult> completeMultipartUpload(String objectName, CompleteMultiPartUploadObject param, BucketInfo bucketInfo);


    /**
     * 上传对象
     *
     * @param objectName 对象名称
     * @param putObject  对象信息
     * @param bucketInfo 通信息
     * @param file       文件信息
     * @return 对象信息
     */
    Result<UploadObjectResult> putObject(String objectName, PutObject putObject, BucketInfo bucketInfo, MultipartFile file);

    /**
     * 获取对象
     *
     * @param objectName 对象名
     * @param bucketInfo 通信息
     */
    void getObject(String objectName, BucketInfo bucketInfo);

    /**
     * 获取对象
     *
     * @param objectName 对象名
     * @param bucketInfo 通信息
     */
    void deleteObject(String objectName, BucketInfo bucketInfo);

    /**
     * @param bucketName 桶名
     * @param objectName 对象名
     * @return 访问地址
     */
    String getObjectUrl(String bucketName, String objectName);
}
